package com.shengqin.utils;

import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import java.math.BigDecimal;
import java.math.RoundingMode;

@Slf4j
public class ProcessTimeResultUtil {

    private static final String TIME_SEPARATOR = ":";
    private static final String MINUTE_SYMBOL = "′";
    private static final String SECOND_SYMBOL = "″";

    public static String processRunResultByPrjName(String result, String prjName, String exportTimeType) {
        if(prjName.equalsIgnoreCase("50米跑") || prjName.equalsIgnoreCase("篮球运球") || prjName.equalsIgnoreCase("足球运球")){
            return processRunResult(result,"秒",exportTimeType,prjName);
        } else if(prjName.equalsIgnoreCase("50米×8往返跑") || prjName.equalsIgnoreCase("800米") || prjName.equalsIgnoreCase("1000米")){
            return processRunResult(result,"分.秒",exportTimeType,prjName);
        } else {
            return result;
        }
    }

    /**
     * 处理计时类测试成绩
     * @param result 原始成绩
     * @param prjUnit 项目单位 (秒/分.秒/分秒)
     * @return 处理后的成绩
     */
    public static String processRunResult(String result, String prjUnit, String exportTimeType,String prjName) {
        if(exportTimeType.equalsIgnoreCase("origin")){
            return result;
        }
        if (!StringUtils.hasLength(result)) {
            return "";
        }
        if(!prjName.equalsIgnoreCase("坐位体前屈") && result.contains("-")){
            return "";
        }
        try {
            // 如果是小数格式（不包含:），必须使用"秒"作为单位
            if (!result.contains(TIME_SEPARATOR)) {
                if (!"秒".equals(prjUnit)) {
                    log.error("小数格式的成绩必须使用秒作为单位, result={}, prjUnit={}", result, prjUnit);
                    return result;
                }
                return processSecondsFormat(result);
            }

            // 处理 00:09.310 格式的成绩
            if ("秒".equals(prjUnit)) {
                return processSecondsFormat(result);
            } else if (prjUnit.contains("分") && prjUnit.contains("秒")) {
                return processMinuteFormat(result);
            }
            return result;
        } catch (Exception e) {
            log.error("处理计时成绩出错, result={}, prjUnit={}", result, prjUnit, e);
            return result;
        }
    }

    /**
     * 处理秒格式的成绩
     */
    private static String processSecondsFormat(String result) {
        BigDecimal seconds;
        
        if (result.contains(TIME_SEPARATOR)) {
            // 处理 00:09.310 格式
            String[] parts = result.split(TIME_SEPARATOR);
            String secondPart = parts[1];
            seconds = new BigDecimal(secondPart);
        } else {
            // 处理 6.71 格式
            seconds = new BigDecimal(result);
        }

        // 保留一位小数，非零进一
        BigDecimal roundedValue = roundUpNonZero(seconds);
        return roundedValue.toString();
    }

    /**
     * 处理分秒格式的成绩
     */
    private static String processMinuteFormat(String result) {
        int totalSeconds;
        
        if (result.contains(TIME_SEPARATOR)) {
            // 处理 00:09.310 格式
            String[] parts = result.split(TIME_SEPARATOR);
            int minutes = Integer.parseInt(parts[0]);
            String[] secondParts = parts[1].split("\\.");
            int seconds = Integer.parseInt(secondParts[0]);
            int milliseconds = Integer.parseInt(secondParts[1]);
            
            // 如果毫秒部分不为0，向上取整到下一秒
            if (milliseconds > 0) {
                seconds++;
            }
            
            totalSeconds = minutes * 60 + seconds;
        } else {
            throw new IllegalArgumentException("分秒格式必须包含冒号分隔符");
        }

        // 转换为分′秒″格式
        int minutes = totalSeconds / 60;
        int seconds = totalSeconds % 60;
        return String.format("%d%s%02d%s", minutes, MINUTE_SYMBOL, seconds, SECOND_SYMBOL);
    }

    /**
     * 对小数进行非零进一处理
     * 保留一位小数，如果第二位小数不为0则进一
     */
    private static BigDecimal roundUpNonZero(BigDecimal value) {
        // 先保留两位小数
        BigDecimal twoDecimal = value.setScale(2, RoundingMode.DOWN);
        
        // 获取第二位小数
        int secondDecimal = twoDecimal.multiply(new BigDecimal("100"))
                                    .remainder(new BigDecimal("10"))
                                    .intValue();
        
        // 如果第二位小数不为0，则进一
        if (secondDecimal > 0) {
            return twoDecimal.setScale(1, RoundingMode.UP);
        } else {
            return twoDecimal.setScale(1, RoundingMode.DOWN);
        }
    }
}
